<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vTZv8pNLfaf1r6tSvmkNqAQxmAk8k81y46LbrxcGCeBR4B9HWAy8HNhzEg3y-hf4Plg15M58ettqT80/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - June 18th 2020</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - June 18th 2020</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">ul.lst-kix_2jqzb52zacrh-0{list-style-type:none}ul.lst-kix_aiix3zgiqopc-2{list-style-type:none}ul.lst-kix_aiix3zgiqopc-3{list-style-type:none}ul.lst-kix_aiix3zgiqopc-0{list-style-type:none}ul.lst-kix_aiix3zgiqopc-1{list-style-type:none}ul.lst-kix_2jqzb52zacrh-4{list-style-type:none}ul.lst-kix_aiix3zgiqopc-6{list-style-type:none}ul.lst-kix_2jqzb52zacrh-3{list-style-type:none}ul.lst-kix_aiix3zgiqopc-7{list-style-type:none}ul.lst-kix_2jqzb52zacrh-2{list-style-type:none}ul.lst-kix_aiix3zgiqopc-4{list-style-type:none}ul.lst-kix_2jqzb52zacrh-1{list-style-type:none}ul.lst-kix_aiix3zgiqopc-5{list-style-type:none}ul.lst-kix_2jqzb52zacrh-8{list-style-type:none}ul.lst-kix_2jqzb52zacrh-7{list-style-type:none}ul.lst-kix_2jqzb52zacrh-6{list-style-type:none}ul.lst-kix_aiix3zgiqopc-8{list-style-type:none}ul.lst-kix_2jqzb52zacrh-5{list-style-type:none}.lst-kix_7nzyprel46a7-7>li:before{content:"\0025cb  "}.lst-kix_aby328m2m2pj-5>li:before{content:"\0025a0  "}.lst-kix_7nzyprel46a7-6>li:before{content:"\0025cf  "}.lst-kix_aby328m2m2pj-2>li:before{content:"\0025a0  "}.lst-kix_aby328m2m2pj-6>li:before{content:"\0025cf  "}.lst-kix_aiix3zgiqopc-8>li:before{content:"\0025a0  "}.lst-kix_7nzyprel46a7-3>li:before{content:"\0025cf  "}.lst-kix_7nzyprel46a7-5>li:before{content:"\0025a0  "}.lst-kix_aby328m2m2pj-3>li:before{content:"\0025cf  "}.lst-kix_7nzyprel46a7-4>li:before{content:"\0025cb  "}.lst-kix_aby328m2m2pj-4>li:before{content:"\0025cb  "}.lst-kix_aby328m2m2pj-1>li:before{content:"\0025cb  "}.lst-kix_7nzyprel46a7-8>li:before{content:"\0025a0  "}.lst-kix_aby328m2m2pj-0>li:before{content:"\0025cf  "}.lst-kix_aiix3zgiqopc-0>li:before{content:"\0025cf  "}.lst-kix_aiix3zgiqopc-1>li:before{content:"\0025cb  "}.lst-kix_m1vfhhosqdll-4>li:before{content:"\0025cb  "}.lst-kix_aiix3zgiqopc-2>li:before{content:"\0025a0  "}.lst-kix_m1vfhhosqdll-3>li:before{content:"\0025cf  "}.lst-kix_m1vfhhosqdll-2>li:before{content:"\0025a0  "}ul.lst-kix_aby328m2m2pj-2{list-style-type:none}.lst-kix_aiix3zgiqopc-4>li:before{content:"\0025cb  "}.lst-kix_aiix3zgiqopc-5>li:before{content:"\0025a0  "}ul.lst-kix_aby328m2m2pj-3{list-style-type:none}ul.lst-kix_aby328m2m2pj-0{list-style-type:none}.lst-kix_7nzyprel46a7-1>li:before{content:"\0025cb  "}ul.lst-kix_aby328m2m2pj-1{list-style-type:none}.lst-kix_aiix3zgiqopc-3>li:before{content:"\0025cf  "}.lst-kix_aiix3zgiqopc-7>li:before{content:"\0025cb  "}.lst-kix_m1vfhhosqdll-1>li:before{content:"\0025cb  "}.lst-kix_7nzyprel46a7-2>li:before{content:"\0025a0  "}ul.lst-kix_aby328m2m2pj-8{list-style-type:none}.lst-kix_aiix3zgiqopc-6>li:before{content:"\0025cf  "}.lst-kix_m1vfhhosqdll-0>li:before{content:"\0025cf  "}ul.lst-kix_aby328m2m2pj-6{list-style-type:none}ul.lst-kix_aby328m2m2pj-7{list-style-type:none}ul.lst-kix_aby328m2m2pj-4{list-style-type:none}.lst-kix_7nzyprel46a7-0>li:before{content:"\0025cf  "}ul.lst-kix_aby328m2m2pj-5{list-style-type:none}.lst-kix_2jqzb52zacrh-3>li:before{content:"\0025cf  "}.lst-kix_2jqzb52zacrh-4>li:before{content:"\0025cb  "}.lst-kix_2jqzb52zacrh-1>li:before{content:"\0025cb  "}.lst-kix_2jqzb52zacrh-2>li:before{content:"\0025a0  "}.lst-kix_2jqzb52zacrh-5>li:before{content:"\0025a0  "}.lst-kix_2jqzb52zacrh-6>li:before{content:"\0025cf  "}.lst-kix_m1vfhhosqdll-5>li:before{content:"\0025a0  "}.lst-kix_m1vfhhosqdll-6>li:before{content:"\0025cf  "}.lst-kix_2jqzb52zacrh-7>li:before{content:"\0025cb  "}.lst-kix_2jqzb52zacrh-8>li:before{content:"\0025a0  "}.lst-kix_m1vfhhosqdll-8>li:before{content:"\0025a0  "}.lst-kix_m1vfhhosqdll-7>li:before{content:"\0025cb  "}.lst-kix_r3lf9oxq4myl-2>li:before{content:"\0025a0  "}.lst-kix_r3lf9oxq4myl-1>li:before{content:"\0025cb  "}.lst-kix_r3lf9oxq4myl-3>li:before{content:"\0025cf  "}.lst-kix_r3lf9oxq4myl-0>li:before{content:"\0025cf  "}.lst-kix_r3lf9oxq4myl-4>li:before{content:"\0025cb  "}.lst-kix_aby328m2m2pj-7>li:before{content:"\0025cb  "}.lst-kix_aby328m2m2pj-8>li:before{content:"\0025a0  "}.lst-kix_r3lf9oxq4myl-8>li:before{content:"\0025a0  "}.lst-kix_r3lf9oxq4myl-6>li:before{content:"\0025cf  "}.lst-kix_r3lf9oxq4myl-5>li:before{content:"\0025a0  "}.lst-kix_r3lf9oxq4myl-7>li:before{content:"\0025cb  "}ul.lst-kix_m1vfhhosqdll-8{list-style-type:none}ul.lst-kix_m1vfhhosqdll-6{list-style-type:none}ul.lst-kix_m1vfhhosqdll-7{list-style-type:none}ul.lst-kix_m1vfhhosqdll-4{list-style-type:none}ul.lst-kix_m1vfhhosqdll-5{list-style-type:none}ul.lst-kix_m1vfhhosqdll-2{list-style-type:none}ul.lst-kix_m1vfhhosqdll-3{list-style-type:none}ul.lst-kix_m1vfhhosqdll-0{list-style-type:none}ul.lst-kix_m1vfhhosqdll-1{list-style-type:none}ul.lst-kix_r3lf9oxq4myl-2{list-style-type:none}ul.lst-kix_r3lf9oxq4myl-1{list-style-type:none}ul.lst-kix_r3lf9oxq4myl-0{list-style-type:none}ul.lst-kix_r3lf9oxq4myl-8{list-style-type:none}ul.lst-kix_r3lf9oxq4myl-7{list-style-type:none}ul.lst-kix_r3lf9oxq4myl-6{list-style-type:none}ul.lst-kix_r3lf9oxq4myl-5{list-style-type:none}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}ul.lst-kix_r3lf9oxq4myl-4{list-style-type:none}ul.lst-kix_r3lf9oxq4myl-3{list-style-type:none}ul.lst-kix_7nzyprel46a7-3{list-style-type:none}ul.lst-kix_7nzyprel46a7-2{list-style-type:none}ul.lst-kix_7nzyprel46a7-5{list-style-type:none}ul.lst-kix_7nzyprel46a7-4{list-style-type:none}ul.lst-kix_7nzyprel46a7-7{list-style-type:none}ul.lst-kix_7nzyprel46a7-6{list-style-type:none}ul.lst-kix_7nzyprel46a7-8{list-style-type:none}.lst-kix_2jqzb52zacrh-0>li:before{content:"\0025cf  "}ul.lst-kix_7nzyprel46a7-1{list-style-type:none}ul.lst-kix_7nzyprel46a7-0{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c3{margin-left:72pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c0{margin-left:36pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c1{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c9{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:20pt;font-family:"Arial";font-style:normal}.c11{padding-top:20pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c4{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c8{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c10{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c7{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c12{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c5{color:inherit;text-decoration:inherit}.c6{padding:0;margin:0}.c2{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c12"><h1 class="c11" id="h.wljvsiz2afnd"><span class="c9">&nbsp;Participants</span></h1><ul class="c6 lst-kix_7nzyprel46a7-0 start"><li class="c0 li-bullet-0"><span class="c1">Noam Helfman, Yoav Weiss, Nic Jansma, Steven Bougon, Thomas Kelly, Gilles Dubuc, Annie Sullivan, Ian Clelland, Michal Mocny, Michelle Vu, Nicolás Peña, Dominic Farolino, Benjamin De Kosnik, Alex Christensen, Ilya Grigorik, Philip Walton</span></li></ul><h2 class="c8" id="h.u6emyj25g50r"><span class="c4">Next Meeting</span></h2><p class="c10"><span class="c1">July 2nd @ 10am PST / 1pm EST</span></p><h2 class="c8" id="h.gptnk16ouuv4"><span class="c4">Presentations</span></h2><h2 class="c8" id="h.9natrn10fyw5"><span>Abandonment (</span><span class="c7"><a class="c5" href="https://www.google.com/url?q=https://github.com/anniesullie/web-page-abandonment-api/blob/master/README.md&amp;sa=D&amp;source=editors&amp;ust=1613234335035000&amp;usg=AOvVaw07Sb86UASfDdZuUu8LwUfx">explainer</a></span><span>, </span><span class="c7"><a class="c5" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1Kvm8YsYA3yHgiRh-_ZFf6jeSc-GP1qGOVqXSVeNzVE4/edit%23slide%3Did.p&amp;sa=D&amp;source=editors&amp;ust=1613234335035000&amp;usg=AOvVaw3eR_PdWc68RmYRWItZfIPX">slides</a></span><span class="c4">)</span></h2><ul class="c6 lst-kix_m1vfhhosqdll-0 start"><li class="c0 li-bullet-0"><span class="c2">Nicolás</span><span class="c1"><b></b>: We've talked about abandonment for a while</span></li><li class="c0 li-bullet-0"><span class="c1">... Want to enable analytics providers and site owners to get visibility about users that leave the page early (before analytics have had time to register themselves)</span></li><li class="c0 li-bullet-0"><span class="c1">… that’s a current blind spot</span></li><li class="c0 li-bullet-0"><span class="c1">... Want sites to be able to correlate against business metrics</span></li><li class="c0 li-bullet-0"><span class="c1">... Abandon definition:</span></li></ul><ul class="c6 lst-kix_m1vfhhosqdll-1 start"><li class="c3 li-bullet-0"><span class="c1">User has explicitly navigated away from the page (redirects don't count)</span></li><li class="c3 li-bullet-0"><span class="c1">Page did not reach First Contentful Paint (FCP)</span></li><li class="c3 li-bullet-0"><span class="c1">Page was in the foreground at some point</span></li></ul><ul class="c6 lst-kix_m1vfhhosqdll-0"><li class="c0 li-bullet-0"><span class="c1">... Non-abandons:</span></li></ul><ul class="c6 lst-kix_m1vfhhosqdll-1 start"><li class="c3 li-bullet-0"><span class="c1">User explicitly navigates away</span></li><li class="c3 li-bullet-0"><span class="c1">Page reached FCP</span></li><li class="c3 li-bullet-0"><span class="c1">Page was in foreground at some point</span></li></ul><ul class="c6 lst-kix_m1vfhhosqdll-0"><li class="c0 li-bullet-0"><span class="c1">... Need non-abandons to have denominator, as some browsers won't support this API and analytics needs to know abandon rate</span></li><li class="c0 li-bullet-0"><span class="c1">... Why FCP? If not reached, the user didn't get value. Reaching FCP doesn’t guarantee user value, but understanding user value is beyond scope for this proposal.</span></li><li class="c0 li-bullet-0"><span class="c1">... Not using onload (unrelated to user experience), LCP (we don’t know we reached LCP when the user abandons) or lack of input (there are pages that don’t require interaction)</span></li><li class="c0 li-bullet-0"><span class="c1">... What should we expose? Counts for abandons and non-abandons</span></li><li class="c0 li-bullet-0"><span class="c1">... Maybe: navstart-to-abandon-time, foreground-duration</span></li><li class="c0 li-bullet-0"><span class="c1">... How to expose this information? &nbsp;Reporting API. &nbsp;Network-centered reporting (via HTTP headers)</span></li></ul><ul class="c6 lst-kix_m1vfhhosqdll-1 start"><li class="c3 li-bullet-0"><span class="c1">Would be better to base that on Origin Policy, but unclear when it will be ready </span></li><li class="c3 li-bullet-0"><span class="c1">NEL-like headers only solution won’t capture first-view cases where abandonment happened before headers arrived</span></li></ul><ul class="c6 lst-kix_m1vfhhosqdll-0"><li class="c0 li-bullet-0"><span class="c2">Ilya</span><span class="c1"><b></b>: NEL currently explicitly excludes user-abandoned actions such as back-button or tab close</span></li><li class="c0 li-bullet-0"><span class="c2">Nic</span><span class="c1"><b></b>: Would this be "sticky" on the domain, where once you register, it would apply to future navigations?</span></li><li class="c0 li-bullet-0"><span class="c2">Ian</span><span class="c1"><b></b>: Yes, and it's per-origin not per-file</span></li><li class="c0 li-bullet-0"><span class="c2">Steven</span><span class="c1"><b></b>: Can you go over how abandonment might be useful?</span></li><li class="c0 li-bullet-0"><span class="c2">Nicolás</span><span class="c1"><b></b>: Let's say you have a normally operating website, and FCP improves. &nbsp;Is it because users were abandoning in the worse-case scenarios?</span></li></ul><ul class="c6 lst-kix_m1vfhhosqdll-1 start"><li class="c3 li-bullet-0"><span class="c1">Also, if you see a smaller number of users reported - is it because more users abandon before you register them?</span></li></ul><ul class="c6 lst-kix_m1vfhhosqdll-0"><li class="c0 li-bullet-0"><span class="c1">... Can also correlate to business metrics</span></li><li class="c0 li-bullet-0"><span class="c2">Ilya</span><span class="c1"><b></b>: There's a non-trivial amount of abandoned navigations across the web, where there's no visibility today. We want to expose that.</span></li><li class="c0 li-bullet-0"><span class="c2">Annie</span><span class="c1"><b></b>: 6-8% of navigations are abandoned on mobile, varies by site. Sites that didn’t meet Core Web Vitals were 24% more likely to be abandoned.</span></li><li class="c0 li-bullet-0"><span class="c2">Ben</span><span class="c1"><b></b>: Does the 6-8% account for network errors or just abandons?</span></li><li class="c0 li-bullet-0"><span class="c2">Annie</span><span class="c1"><b></b>: Just user abandons, excluded redirects or other detectable network errors in the numerator or denominator</span></li><li class="c0 li-bullet-0"><span class="c2">Michelle</span><span class="c1"><b></b>: From Pinterest, we are interested in this as we've just done an abandonment analysis, but are probably missing cases that don’t register. &nbsp;Were there other metrics besides FCP considered, like TTI?</span></li><li class="c0 li-bullet-0"><span class="c2">Annie</span><span class="c1"><b></b>: TTI might be too late, LCP is a continuous metric that may always increase over time</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: One thought is to have FCP as default, but the website could declare a certain JS variable that if it was never defined by JS, the page was abandoned. For the site to say what it considers a non-abandonment</span></li><li class="c0 li-bullet-0"><span class="c2">Nicolás</span><span class="c1"><b></b>: We could definitely have a parameter that enables sites measure their own definition of abandonment</span></li><li class="c0 li-bullet-0"><span class="c2">Philip</span><span class="c1"><b></b>: Could we report abandons that hadn't reached onload versus abandons that haven't reached FCP? Because mostly by onload the page is configured and tracked by other analytics</span></li><li class="c0 li-bullet-0"><span class="c2">Nicolás</span><span class="c1"><b></b>: What are we trying to incentivize. Onload can be made arbitrarily fast, but that doesn’t improve the UX. </span></li><li class="c0 li-bullet-0"><span class="c1">… Worth considering if there’s another point in time where we’re sure analytics are registered, but don’t know what that point in time would be. Might be better to have it be site provided.</span></li><li class="c0 li-bullet-0"><span class="c2">Philip</span><span class="c1"><b></b>: Scenario where a user sees a loading screen, but it hasn't reached onload or loaded analytics</span></li><li class="c0 li-bullet-0"><span class="c2">Nicolás</span><span class="c1"><b></b>: Could that be covered by the site-provided proposal?</span></li><li class="c0 li-bullet-0"><span class="c2">Ilya</span><span class="c1"><b></b>: Might be worthwhile to split up 2 cases - Up to FCP analytics could not have run. &nbsp;After FCP, the page is being constructed but analytics may be running.</span></li><li class="c0 li-bullet-0"><span class="c2">Michal</span><span class="c1"><b></b>: What Michelle was pointing out was more along User Experience abandons, that they want to measure when visitor is interacting with the page and abandons it. </span></li><li class="c0 li-bullet-0"><span class="c1">... Which is separate from the un-measurable experiences today (before FCP was reached). Maybe worthwhile to use a different name than “abandonment”</span></li><li class="c0 li-bullet-0"><span class="c2">Annie</span><span class="c1"><b></b>: There’s also “cart abandonment”</span></li><li class="c0 li-bullet-0"><span class="c2">Ilya</span><span class="c1"><b></b>: One question was dependency on Reporting API / origin-policy and how that would affect our timeline</span></li><li class="c0 li-bullet-0"><span class="c2">Nicolás</span><span><b></b>: Origin-policy should be going forward and not affect our timeline </span></li></ul><h2 class="c8" id="h.9lkepp9pkzce"><span class="c4">Back-Forward Cache and RUM metrics</span></h2><ul class="c6 lst-kix_2jqzb52zacrh-0 start"><li class="c0 li-bullet-0"><span class="c7"><a class="c5" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/11MTKvv9tTXqz-atdLQCq1d_Hnoyo0VOtvZf4NpkudTA/edit%23slide%3Did.p&amp;sa=D&amp;source=editors&amp;ust=1613234335041000&amp;usg=AOvVaw1kYQILW9YiuMox6olLgMGp">Back-forward cache and RUM metrics</a></span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: We've talked about this in the past but didn't really reach any conclusions</span></li><li class="c0 li-bullet-0"><span class="c1">... Browser may implement or improve bfcache</span></li><li class="c0 li-bullet-0"><span class="c1">... Sites can change to be "BF Cache eligible" by changing event registrations (unload)</span></li><li class="c0 li-bullet-0"><span class="c1">... Can result in user experience changes</span></li><li class="c0 li-bullet-0"><span class="c1">... What can we do about it?</span></li><li class="c0 li-bullet-0"><span class="c1">... Update old metrics? &nbsp; Seems destructive. &nbsp;Might not be web-compatible for current analytics scripts.</span></li><li class="c0 li-bullet-0"><span class="c1">... Fire new metrics? &nbsp;For those we care about, and have analytics scripts capture those new entries.</span></li><li class="c0 li-bullet-0"><span class="c1">... Which metrics? &nbsp;NavigationTiming, Paint Timings.</span></li></ul><ul class="c6 lst-kix_2jqzb52zacrh-1 start"><li class="c3 li-bullet-0"><span class="c1">But we’d also need to correlate other metrics to page loads.</span></li></ul><ul class="c6 lst-kix_2jqzb52zacrh-0"><li class="c0 li-bullet-0"><span class="c1">... Web compat: Size of NavigationTiming timing array today is usually 1 and if we add new entries it may cause compat concerns.</span></li><li class="c0 li-bullet-0"><span class="c1">... Similar for Paint Timings.</span></li><li class="c0 li-bullet-0"><span class="c1">... Correlate ResourceTiming, ElementTiming, EventTiming, Layout Instability to page loads. &nbsp;Need to be able to split those out from one another.</span></li><li class="c0 li-bullet-0"><span class="c1">... Multiple Time Origins? &nbsp;All metrics are based out of a single time origin today. &nbsp;Should we have a metric that shows after N milliseconds in, this is a new page load. &nbsp;Allow for filtering of entries by navigation.</span></li><li class="c0 li-bullet-0"><span class="c2">Nic</span><span class="c1"><b></b>: Would each new NavigationTiming entry be the "start" of each new time origin</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: That would be possible, or something similar with Visibility Observer</span></li><li class="c0 li-bullet-0"><span class="c1">... Right now the method to know whether your page has gone into or out of bfcache is through the pageshow / pagehide events, which aren't necessarily integrated into the Observer interfaces.</span></li><li class="c0 li-bullet-0"><span class="c1">... The other thing we need to consider is SPA navigations. &nbsp;Do they affect time origins?</span></li><li class="c0 li-bullet-0"><span class="c2">Ilya</span><span class="c1"><b></b>: BFCache is new to Chromium, but not other engines. How do existing analytics providers treat it?</span></li><li class="c0 li-bullet-0"><span class="c2">Nic</span><span class="c1"><b></b>: mPulse doesn’t measure it today</span></li><li class="c0 li-bullet-0"><span class="c2">Michal</span><span class="c1"><b></b>: Do existing analytics providers take visibility state into account today?</span></li><li class="c0 li-bullet-0"><span class="c2"><b>Nic</b>: </span><span class="c1">For mPulse/Boomerang, we track visibility state (and last time it was hidden/visible) on the beacon, and let our customer segment their data on that state</span></li><li class="c0 li-bullet-0"><span class="c2">Steven</span><span class="c1"><b></b>: Yes visibility, no BFCache</span></li><li class="c0 li-bullet-0"><span class="c2">Michal</span><span class="c1"><b></b>: Like the comparison to visibility. What about background tabs?</span></li></ul><ul class="c6 lst-kix_2jqzb52zacrh-1 start"><li class="c3 li-bullet-0"><span class="c1">If you have separate “foreground sessions” to a certain tab, does the analytics get split up?</span></li></ul><ul class="c6 lst-kix_2jqzb52zacrh-0"><li class="c0 li-bullet-0"><span class="c2">Nic</span><span class="c1"><b></b>: mPulse tracks visibility state and customers can split their data based on that. Most people don’t, but we’re currently promoting that.</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: Folks running web properties - is this something you consider today?</span></li><li class="c0 li-bullet-0"><span class="c2">Steven</span><span class="c1"><b></b>: Not BF cache, but we do consider visibility.</span></li><li class="c0 li-bullet-0"><span class="c2">Michelle</span><span class="c1"><b></b>: Same here, we just started taking visibility into account last year</span></li><li class="c0 li-bullet-0"><span class="c2">Gilles</span><span class="c1"><b></b>: Same. But we don’t like the current approach to visibility of simply filtering it out. Would be better to still measure those scenarios and be able to identify them.</span></li><li class="c0 li-bullet-0"><span class="c2">Philip</span><span class="c1"><b></b>: Our concern is that when Chrome ships BFCache, things that used to be back-forward navigations that were fast, will no longer be full navigations, so those won't be represented in metrics. </span></li><li class="c0 li-bullet-0"><span class="c1">… &nbsp;i.e. compared to other browsers, today Chrome reports additional navigations because there's no BFCache, but that will soon change.</span></li><li class="c0 li-bullet-0"><span class="c1">... How do existing analytics providers show data for BFCache navigations?</span></li><li class="c0 li-bullet-0"><span class="c2">Nic</span><span class="c1"><b></b>: I can only remember a few times our customers have asked about BFCache, so the industry doesn't seem to be well educated about it. &nbsp;It's probably on analytics providers to highlight these types of navigations better.</span></li><li class="c0 li-bullet-0"><span class="c2">Michal</span><span class="c1"><b></b>: Similarly it is related to SPAs. SPAs that manually handle the back button, won’t be counted as navigation as well.</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: So generally people don’t measure BF cache navigation just yet, but it would be good to start?</span></li><li class="c0 li-bullet-0"><span class="c2">Gilles</span><span class="c1"><b></b>: How does one know it's a BFCache, is it in navigation.type?</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: It's actually not represented, the DOM is the same as from before, i.e. navigation.type is the same as when the page first loaded. You’re just getting a pageshow event</span></li><li class="c0 li-bullet-0"><span class="c2">Philip</span><span class="c1"><b></b>: Discussed at TPAC last year - Firefox were considering updating the type in that case</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: There’s a “history navigation” type, but it’s not stated if it’s a BF cache one or a regular history navigation. And in the case of BF cache it’s not updated. We’d likely mint a new type.</span></li><li class="c0 li-bullet-0"><span class="c2">Michal</span><span class="c1"><b></b>: Important to track BF cache navigation, but the total number of navigations a user commits will affect their metrics depending on how you track it. Many things can influence that. User-behavior and how many top-level navigations they commit during a session is important for tracking the user experience.</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: UX can vary based on many factors. We’re trying to minimze disruption by the BF cache introduction, but would be good to measure things holistically.</span></li><li class="c0 li-bullet-0"><span class="c2">Michal</span><span class="c1"><b></b>: Comparison to Visibility is interesting. If the user chooses to “open in new tab” and then go back, is that significantly different than navigating to the new page and then clicking “back”? </span></li><li class="c0 li-bullet-0"><span class="c1">… We’re hoping that BF cache navigation is super fast, but so is moving a tab from background to foreground. The overall perf story seems very similar</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: So you want moving to BG and then FG to also count as a “fast navigation”?</span></li><li class="c0 li-bullet-0"><span class="c2">Michal</span><span class="c1"><b></b>: If BF cache counts, so should this</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: BF cache is somewhat different, as if you’re not in the cache, the experience is slower. But that’s also potentially true for BG, e.g. if the browser threw your process out of memory, forcing a new load for the page.</span></li><li class="c0 li-bullet-0"><span class="c2">Ilya</span><span class="c1"><b></b>: If I'm hearing you properly, there are many factors that affect navigations. &nbsp;In the particular context of BFCache, the industry is currently ignoring that. &nbsp;</span></li><li class="c0 li-bullet-0"><span class="c1">…When we ship this in Chrome, it may look like performance has regressed (because the denominator has changed), where the true story is that it has improved. </span></li><li class="c0 li-bullet-0"><span class="c1">... Because sites aren't looking at this dimension, they aren't optimizing for it. &nbsp;If you don't know that, you're excluding an easy win for your site.</span></li><li class="c0 li-bullet-0"><span class="c2">Michal</span><span class="c1"><b></b>: Good summary. This is one of many examples where you can influence the total number of navigations. I don’t see why this case is special</span></li><li class="c0 li-bullet-0"><span class="c2">Yoav</span><span class="c1"><b></b>: Would be good to consider all of them holistically, and plan for an extensible solution that can fit these future types.</span></li></ul><h2 class="c8" id="h.m8hx7ix03u6j"><span class="c4">Next Call</span></h2><ul class="c6 lst-kix_r3lf9oxq4myl-0 start"><li class="c0 li-bullet-0"><span class="c2"><b>Proposal</b>: Maybe worthwhile to move </span><span>to Tuesday June 30th to avoid holidays. </span><span>Yoav to check.</span></li></ul></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjozj80mLdCSCb1X0Y-zlbP5gm32VAmr4nh54m36-dqaX1lhqVox23G4dMGSw6xdHERjlOM5gamw1VwxQrS8:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>